#include "ProcedimentoFuncao.h"

/*
 * @resume: construtor da classe ProcedimentoFuncao
 */
ProcedimentoFuncao::ProcedimentoFuncao() {

}

/*
 * @resume: construtor da classe ProcedimentoFuncao
 * @param: string identificador, int categoria,
 * 			int nivel, string procedimentoPai, int linha, string returnFuncao,
 * 			int dislocate, int quantidade) : IdentificadorGenerico(identificador,
 * 			categoria, nivel, procedimentoPai,linha)
 */
ProcedimentoFuncao::ProcedimentoFuncao(string identificador, int categoria,
		int nivel, string procedimentoPai, int linha, string returnFuncao,
		int dislocate, int quantidade) :
	IdentificadorGenerico(identificador, categoria, nivel, procedimentoPai,
			linha) {

	this->returnFuncao = returnFuncao;
	this->dislocateProcedimentoFuncao = dislocate;
	this->quantidadeParameter = quantidade;
}

/*
 * @resume: destrutor da classe ProcedimentoFuncao
 */
ProcedimentoFuncao::~ProcedimentoFuncao() {

}

/*
 * @resume: metodo utilizado para setar o retorno da funcao
 * @param: string returnFuncao
 */
void ProcedimentoFuncao::setReturnFuncao(string returnFuncao) {
	this->returnFuncao = returnFuncao;
}

/*
 * @resume: metodo utilizado para setar o deslocamento da funcao ou procedimento
 * @param: int dislocate
 */
void ProcedimentoFuncao::setDislocateProcedimentoFuncao(int dislocate) {
	this->dislocateProcedimentoFuncao = dislocate;
}

/*
 * @resume: metodo utilizado para inserir parametros no procedimento ou funcao
 * @param: Parametro *parametro
 */
void ProcedimentoFuncao::insertParameterProcedimentoFuncao(Parametro *parametro) {
	this->parameterProcedimentoFuncao.push_back(parametro);
}

/*
 * @resume: metodo utilizado para setar a quantidade de parametros
 * @param: int quantidadeParameter
 */
void ProcedimentoFuncao::setQuantidadeParameter(int quantidadeParameter) {
	this->quantidadeParameter = quantidadeParameter;
}

/*
 * @resume: metodo utilizado para obter o retorno da funcao
 * @return: string returnFuncao
 */
string ProcedimentoFuncao::getReturnFuncao() {
	return (this->returnFuncao);
}

/*
 * @resume: metodo utilizado para obter o deslocamento da funcao ou procedimento
 * @return: int dislocateProcedimentoFuncao
 */
int ProcedimentoFuncao::getDislocateProcedimentoFuncao() {
	return (this->dislocateProcedimentoFuncao);
}

/*
 * @resume: metodo utilizado para obter os parametros da funcao ou procedimento
 * @return: list<Parametro*> parameterProcedimentoFuncao
 */
list<Parametro*> ProcedimentoFuncao::getParametersProcedimentoFuncao() {
	return (this->parameterProcedimentoFuncao);
}

/*
 * @resume: metodo utilizado para obter a quantidade dos parametros da funcao ou procedimento
 * @return: int quantidadeParameter
 */
int ProcedimentoFuncao::getQuantidadeParameter() {
	return (this->quantidadeParameter);
}

/*
 * @resume: metodo utilizado para imprimir a funcao ou procedimento no arquivo de saida (hashTable.txt)
 * @return: Arquivo& fileOut
 */
void ProcedimentoFuncao::show(Arquivo& fileOut) {
	fileOut.write(" | Categoria:");
	if (getCategoriaIdentificador() == 3) {
		fileOut.write(" function \n");
	} else {
		fileOut.write(" procedure \n");
	}
	fileOut.write(" | Nivel: " + IntToString(getNivelIdentificador()) + "\n");
	fileOut.write(" | Procedimento Pai: " + getProcedimentoPaiIdentificador()
			+ "\n");
	fileOut.write(" | Nro Parametros: " + IntToString(getQuantidadeParameter())
			+ "\n");
	if (getCategoriaIdentificador() == 3) {
		fileOut.write(" | Deslocamento: " + IntToString(
				getDislocateProcedimentoFuncao()) + "\n");
		fileOut.write(" | Retorno: " + getReturnFuncao() + "\n");
	}
	fileOut.write(" | Linha: " + IntToString(getLinhaIdentificador()) + "\n");
	fileOut.write(" | Rotulo: " + getIdentificador() + "\n");
}

string ProcedimentoFuncao::getNameProcedureFunctionMepa() const {
	return (this->nameProcedureFunctionMepa);
}

void ProcedimentoFuncao::setNameProcedureFunctionMepa(string str) {
	this->nameProcedureFunctionMepa = str;
}

